浅拷贝
对象
Object.assign
123456let a = {age: 1}let b = Object.assign({}, a)a.age = 2console.log(b.age) // 1展开运算符(…)
|
|
但是
|
|
同样123456789let a = { age: 1, jobs: { first: 'FE' }}let b = {...a}a.jobs.first = 'native'console.log(b.jobs.first) // native
浅拷贝只解决了第一层的问题,如果接下去的值中还有对象的话,那么就又回到刚开始的话题了,两者享有相同的引用。要解决这个问题,我们需要引入深拷贝。
数组
我们可以利用数组的一些方法比如:slice、concat 返回一个新数组的特性来实现拷贝。
|
|
但是
|
|
同样,这两种方法也只能拷贝一层,克隆的并不彻底。
如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化。
我们把这种复制引用的拷贝方法称之为浅拷贝,与之对应的就是深拷贝,深拷贝就是指完全的拷贝一个对象,即使嵌套了对象,两者也相互分离,修改一个对象的属性,也不会影响另一个。
浅拷贝的实现
|
|
深拷贝
使用JSON.parse(JSON.stringify(object))
|
|
但是该方法也是有局限性的:
- 忽略 undefined
- 忽略 symbol
- 不能序列化函数
- 不能解决循环引用的对象
|
|
|
|
递归实现深拷贝
在拷贝的时候判断一下属性值的类型,如果是对象,就递归调用深拷贝函数.
|
|
